﻿Imports System.Data.SqlClient
Imports System.IO
Imports Sendkey = System.Windows.Forms.SendKeys
'Imports System.Threading

Public Class FrmProcuradores

#Region "Variables"

    Private cGeneral As New clsGeneral
    Private cProcuradores As New clsProcuradores
    Private cArea As New clsAreas

    Dim dtAreas As New DataTable()
    Dim dtFuncionarios As New DataTable()   ' para mostrar los funcionarios candidatos a procurador según RH
    Dim dtProcuradores As New DataTable()
    Dim NuevaFila As DataRow

    Dim li_Respuesta As Int16

#End Region

#Region "Eventos"

    Private Sub FrmProcuradores_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        gs_Pantalla = Me.Name

        dtAreas = cArea.ObtenerAreas("Alfabetico")
        Cmb_Area.DataSource = dtAreas
        Cmb_Area.ValueMember = dtAreas.Columns(0).ToString
        Cmb_Area.DisplayMember = dtAreas.Columns(1).ToString

        dtProcuradores.Clear()
        dtProcuradores = cProcuradores.ObtenerProcuradores("Alfabetico", "Todos")
        If dtProcuradores.Rows.Count > 0 Then
            Despliega()
        Else
            Limpiar()
        End If

    End Sub

    Private Sub FrmProcuradores_Activated(sender As Object, e As EventArgs) Handles Me.Activated
        Txt_Tratamiento.Focus()
    End Sub

    Private Sub Nuevo_Click(sender As Object, e As EventArgs) Handles Nuevo.Click
        Limpiar()
        ' carga dtFuncionarios con funcionarios eliminando los Procuradores actuales
        dtFuncionarios = cProcuradores.ObtenerFuncionarios("Alfabetico", "Activo")
        Dim ListaAux As New List(Of DataRow)
        For Each dr As DataRow In dtFuncionarios.Rows
            Dim FilaEncontrada() As DataRow = dtProcuradores.Select("Cedula = " & dr("Cedula"))
            If FilaEncontrada.Count <> 0 Then
                ListaAux.Add(dr)
            End If
        Next
        For Each dr As DataRow In ListaAux
            dtFuncionarios.Rows.Remove(dr)
        Next
        ' filtra dtFuncionarios con funcionarios profesionales candidatos a procurador
        dtFuncionarios = cGeneral.DataTable_Filtrar_Ordenar(dtFuncionarios, _
                                                            "Cargo LIKE '%Procurador%' OR ( Cargo LIKE '%Profesional%' AND Cargo LIKE '%Servicio Civil%' )", _
                                                             "Nombre_Funcionario")
        Cmb_FuncionariosDisponibles.DataSource = Nothing
        Cmb_FuncionariosDisponibles.DataSource = dtFuncionarios
        Cmb_FuncionariosDisponibles.ValueMember = dtFuncionarios.Columns(0).ToString
        Cmb_FuncionariosDisponibles.DisplayMember = dtFuncionarios.Columns(1).ToString
        Grp_FuncionariosDisponibles.Visible = True
        Cmb_FuncionariosDisponibles.Focus()
    End Sub

    Private Sub Guardar_Click(sender As Object, e As EventArgs) Handles Guardar.Click
        If Grp_FuncionariosDisponibles.Visible Then
            MessageBox.Show("Error - Debe cerrar la selección de nuevo procurador")
            Btn_Regresar.Focus()
        ElseIf Txt_Tratamiento.Text.Trim = "" Then
            MessageBox.Show("Error - Tratamiento no puede quedar vacío")
            Txt_Tratamiento.Focus()
        ElseIf Txt_GradoProcurador.Text.Trim = "" Then
            MessageBox.Show("Error - Grado no puede quedar vacío")
            Txt_GradoProcurador.Focus()
        ElseIf Txt_Cargo.Text.Trim = "" Then
            MessageBox.Show("Error - Cargo no puede quedar vacío")
            Txt_Cargo.Focus()
        ElseIf Txt_Carnet.Text.Trim = "" Then
            MessageBox.Show("Error - Carnet no puede quedar vacío")
            Txt_Carnet.Focus()
        ElseIf Txt_Calidades.Text.Trim = "" Then
            MessageBox.Show("Error - Calidades no puede quedar vacío")
            Txt_Calidades.Focus()
        ElseIf Txt_Acuerdo_MinJusticia.Text.Trim = "" Then
            MessageBox.Show("Error - Acuerdo no puede quedar vacío")
            Txt_Acuerdo_MinJusticia.Focus()
        Else
            ' carga valores del objeto
            If Txt_Codigo.Text.Trim = "" Then
                cProcuradores.Codigo = -1     ' para facilitar posicionamiento en DataTable luego de Incluir en cProcuradores.Guardar()
            Else
                cProcuradores.Codigo = Txt_Codigo.Text.Trim ' se asigna sólo por formalidad, pero ya contiene dicho valor
            End If
            cProcuradores.Cedula = Txt_Cedula.Text.Trim
            cProcuradores.Nombre = Txt_Nombre.Text.Trim
            cProcuradores.Tratamiento = Txt_Tratamiento.Text.Trim
            cProcuradores.GradoProcurador = Txt_GradoProcurador.Text.Trim
            cProcuradores.CargoProcurador = Txt_Cargo.Text.Trim
            cProcuradores.Area = Cmb_Area.SelectedValue
            cProcuradores.Carnet = Txt_Carnet.Text.Trim
            cProcuradores.CalidadesProcurador = Txt_Calidades.Text.Trim
            cProcuradores.Acuerdo_MinJusticia = Txt_Acuerdo_MinJusticia.Text.Trim
            ' carga valores para Auditoría
            cProcuradores.Aplicacion = gs_Sistema_Nombre
            cProcuradores.Pantalla = gs_Pantalla
            cProcuradores.Usuario = gs_Usuario
            cProcuradores.Maquina = gs_Maquina
            cProcuradores.Guardar()    ' cProcuradores.EstadoGuardar contiene el Id insertado o modificado
            If cProcuradores.EstadoGuardar = -1 Then   ' -1 = Error
                ' cProcuradores.Guardar() despliega el mensaje de error
            Else
                ' Determina si los valores a almacenar ya existen o no
                If cProcuradores.Codigo = -1 Then      ' -1 = Incluir
                    cProcuradores.Codigo = cProcuradores.EstadoGuardar
                    ' recarga el DataTable y lo reposiciona para refrescar el formulario
                    dtProcuradores.Clear()
                    dtProcuradores = cProcuradores.ObtenerProcuradores("Alfabetico", "Todos")
                    For i As Integer = 0 To dtProcuradores.Rows.Count - 1
                        If dtProcuradores.Rows(i).Item(0) = cProcuradores.Codigo Then
                            li_Respuesta = i
                            Exit For
                        End If
                    Next
                    BindingContext(dtProcuradores).Position = li_Respuesta
                    Despliega()
                Else
                    ' modifica los datos actuales del DataTable
                    NuevaFila = dtProcuradores.Select("Procurador=" & cProcuradores.Codigo)(0)
                    NuevaFila.Item("Cedula") = cProcuradores.Cedula
                    NuevaFila.Item("Nombre_Procurador") = cProcuradores.Nombre
                    NuevaFila.Item("Tratamiento") = cProcuradores.Tratamiento
                    NuevaFila.Item("GradoProcurador") = cProcuradores.GradoProcurador
                    NuevaFila.Item("CargoProcurador") = cProcuradores.CargoProcurador
                    NuevaFila.Item("Area") = cProcuradores.Area
                    NuevaFila.Item("Carnet") = cProcuradores.Carnet
                    NuevaFila.Item("CalidadesProcurador") = cProcuradores.CalidadesProcurador
                    NuevaFila.Item("Acuerdo_MinJusticia") = cProcuradores.Acuerdo_MinJusticia
                    ' NO hace falta refrescar el formulario con Despliega()
                End If
            End If
        End If
    End Sub

    Private Sub Buscar_Click(sender As Object, e As EventArgs) Handles Buscar.Click
        FrmConsulta.Tag = "Procurador"
        FrmConsulta.dt = dtProcuradores
        FrmConsulta.ShowDialog()
        Application.DoEvents()
        If gi_Codigo_1 <> -1 Then ' posiciona el registro seleccionado
            For Fila As Integer = 0 To dtProcuradores.Rows.Count - 1
                If dtProcuradores.Rows(Fila).Item(0) = gi_Codigo_1 Then
                    BindingContext(dtProcuradores).Position = Fila
                    Exit For
                End If
            Next
            Despliega()
        End If
    End Sub

    Private Sub Imprimir_Click(sender As Object, e As EventArgs) Handles Imprimir.Click
        'Dim dt_RPT As New DataTable("Resultados")
        'Dim NuevaFila As DataRow
        'Dim CrReport As New CrystalDecisions.CrystalReports.Engine.ReportDocument

        If dtProcuradores.Rows.Count > 0 Then
            Try
                '    dt_RPT.Columns.Add("Codigo")
                '    dt_RPT.Columns.Add("Descripcion")
                '    dt_RPT.Columns.Add("Titulo_Reporte")
                '    For Fila As Integer = 0 To ds.Tables("Resultados").Rows.Count - 1
                '        NuevaFila = dt_RPT.NewRow()
                '        NuevaFila("Codigo") = ds.Tables("Resultados").Rows(Fila).Item("ID_Contexto")
                '        NuevaFila("Descripcion") = ds.Tables("Resultados").Rows(Fila).Item("Nom_Contexto")
                '        NuevaFila("Titulo_Reporte") = "Reporte de Contextos"
                '        dt_RPT.Rows.Add(NuevaFila)
                '    Next

                '    CrReport = New CrystalDecisions.CrystalReports.Engine.ReportDocument()

                '    CrReport.Load(gs_RutaReportes & "RptCatalogos.rpt")

                '    CrReport.SetDataSource(dt_RPT)
                '    Frm_RPT_Visor.CrystalReportViewer1.ReportSource = CrReport
                '    Frm_RPT_Visor.Show()

            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
        Else
            MessageBox.Show("No hay datos para imprimir")
        End If
    End Sub

    Private Sub Excel_Click(sender As Object, e As EventArgs) Handles Excel.Click
        If dtProcuradores.Rows.Count > 0 Then
            cGeneral.DataTable_a_Excel(dtProcuradores, BarraProgreso)
        Else
            MessageBox.Show("No hay datos para exportar")
        End If
    End Sub

    ' Cada formulario tiene un objeto BindingContext que mantiene el rastro de todos los recursos 
    ' de datos asociados con la forma. 
    ' Para referirse a una tabla utilice:
    '       BindingContext(nombre_DataTable)
    '
    ' Para referirse a una tabla dentro del Dataset utilice:
    '       BindingContext(nombre_Dataset, "NombreTabla")
    '
    ' El objeto BindingContext tiene una propiedad Position que indica el registro actual 
    ' y una propiedad Count que indica el Total de registros en el Dataset. El primer registro tiene 
    ' la posición 0, por lo que el último registro tiene la posición Count - 1. 

    Private Sub Primero_Click(sender As Object, e As EventArgs) Handles Primero.Click
        If BindingContext(dtProcuradores).Count > 0 Then
            BindingContext(dtProcuradores).Position = 0
            Despliega()
        Else
            Limpiar()
        End If
    End Sub

    Private Sub Anterior_Click(sender As Object, e As EventArgs) Handles Anterior.Click
        If BindingContext(dtProcuradores).Count > 0 Then
            If BindingContext(dtProcuradores).Position > 0 Then
                BindingContext(dtProcuradores).Position -= 1
                Despliega()
            End If
        Else
            Limpiar()
        End If
    End Sub

    Private Sub Siguiente_Click(sender As Object, e As EventArgs) Handles Siguiente.Click
        If BindingContext(dtProcuradores).Count > 0 Then
            If BindingContext(dtProcuradores).Position < BindingContext(dtProcuradores).Count - 1 Then
                BindingContext(dtProcuradores).Position += 1
                Despliega()
            End If
        Else
            Limpiar()
        End If
    End Sub

    Private Sub Ultimo_Click(sender As Object, e As EventArgs) Handles Ultimo.Click
        If BindingContext(dtProcuradores).Count > 0 Then
            BindingContext(dtProcuradores).Position = BindingContext(dtProcuradores).Count - 1
            Despliega()
        Else
            Limpiar()
        End If
    End Sub

    Private Sub Borrar_Click(sender As Object, e As EventArgs) Handles Borrar.Click
        If Txt_Codigo.Text.Trim = "" Then
            MessageBox.Show("Debe haber definido un código para poder borrarlo.")
            Txt_Codigo.Focus()
        Else
            li_Respuesta = MessageBox.Show("¿Desea BORRAR el registro de Procurador = " & Txt_Codigo.Text & "?", "", MessageBoxButtons.YesNo)
            If li_Respuesta = vbYes Then
                ' carga valores del objeto
                cProcuradores.Codigo = CType(Txt_Codigo.Text, Integer)
                ' carga valores para Auditoría
                cProcuradores.Aplicacion = gs_Sistema_Nombre
                cProcuradores.Pantalla = gs_Pantalla
                cProcuradores.Usuario = gs_Usuario
                cProcuradores.Maquina = gs_Maquina
                cProcuradores.Borrar()    ' cProcuradores.EstadoGuardar contiene el Id insertado o modificado
                If cProcuradores.EstadoGuardar = -1 Then   ' -1 = Error
                    ' cProcuradores.Borrar() despliega el mensaje de error
                Else
                    dtProcuradores.Rows.RemoveAt(BindingContext(dtProcuradores).Position)
                    If dtProcuradores.Rows.Count > 0 Then
                        ' se posiciona en el último registro
                        BindingContext(dtProcuradores).Position = BindingContext(dtProcuradores).Count - 1
                        Despliega()
                    Else
                        Limpiar()
                    End If
                End If
            End If
        End If
    End Sub

    Private Sub Txt_Tratamiento_KeyPress(sender As Object, e As KeyPressEventArgs) Handles Txt_Tratamiento.KeyPress
        If Asc(e.KeyChar) = Keys.Return Then
            Sendkey.Send("{tab}")
        ElseIf Asc(e.KeyChar) <> 8 Then
            If InStr("ABCDEFGHIJKLMNOPQRSTUVWXYZ.", Char.ToUpper(e.KeyChar)) = 0 Then
                MessageBox.Show("Caracter inválido, use letras y punto")
                e.Handled = True
            End If
        End If
    End Sub

    Private Sub Txt_Tratamiento_Validating(sender As Object, e As System.ComponentModel.CancelEventArgs) Handles Txt_Tratamiento.Validating
        If Txt_Tratamiento.Text.Trim = "" And Not Grp_FuncionariosDisponibles.Visible Then
            MessageBox.Show("Error - Tratamiento no puede quedar vacío")
            e.Cancel = True
        End If
    End Sub

    Private Sub Txt_GradoProcurador_KeyPress(sender As Object, e As KeyPressEventArgs) Handles Txt_GradoProcurador.KeyPress
        If Asc(e.KeyChar) = Keys.Return Then
            Sendkey.Send("{tab}")
        ElseIf Asc(e.KeyChar) <> 8 Then
            If InStr("ABCDEFGHIJKLMNOPQRSTUVWXYZ", Char.ToUpper(e.KeyChar)) = 0 Then
                MessageBox.Show("Caracter inválido, use letras")
                e.Handled = True
            End If
        End If
    End Sub

    Private Sub Txt_GradoProcurador_Validating(sender As Object, e As System.ComponentModel.CancelEventArgs) Handles Txt_GradoProcurador.Validating
        If Txt_GradoProcurador.Text.Trim = "" Then
            MessageBox.Show("Error - Grado no puede quedar vacío")
            e.Cancel = True
        End If
    End Sub

    Private Sub Txt_Cargo_KeyPress(sender As Object, e As KeyPressEventArgs) Handles Txt_Cargo.KeyPress
        If Asc(e.KeyChar) = Keys.Return Then
            Sendkey.Send("{tab}")
        ElseIf Asc(e.KeyChar) <> 8 Then
            If InStr("ABCDEFGHIJKLMNOPQRSTUVWXYZ ", Char.ToUpper(e.KeyChar)) = 0 Then
                MessageBox.Show("Caracter inválido, use letras y espacio en blanco")
                e.Handled = True
            End If
        End If
    End Sub

    Private Sub Txt_Cargo_Validating(sender As Object, e As System.ComponentModel.CancelEventArgs) Handles Txt_Cargo.Validating
        If Txt_Cargo.Text.Trim = "" Then
            MessageBox.Show("Error - Cargo no puede quedar vacío")
            e.Cancel = True
        End If
    End Sub

    Private Sub Txt_Carnet_KeyPress(sender As Object, e As KeyPressEventArgs) Handles Txt_Carnet.KeyPress
        If Asc(e.KeyChar) = Keys.Return Then
            Sendkey.Send("{tab}")
        ElseIf Asc(e.KeyChar) <> 8 Then
            If InStr("0123456789", Char.ToUpper(e.KeyChar)) = 0 Then
                MessageBox.Show("Caracter inválido, use dígitos")
                e.Handled = True
            End If
        End If
    End Sub

    Private Sub Txt_Carnet_Validating(sender As Object, e As System.ComponentModel.CancelEventArgs) Handles Txt_Carnet.Validating
        If Txt_Carnet.Text.Trim = "" Then
            MessageBox.Show("Error - Carnet no puede quedar vacío")
            e.Cancel = True
        End If
    End Sub

    Private Sub Txt_Calidades_KeyPress(sender As Object, e As KeyPressEventArgs) Handles Txt_Calidades.KeyPress
        If Asc(e.KeyChar) = Keys.Return Then
            Sendkey.Send("{tab}")
        ElseIf Asc(e.KeyChar) <> 8 Then
            If InStr("ABCDEFGHIJKLMNOPQRSTUVWXYZ, 0123456789-", Char.ToUpper(e.KeyChar)) = 0 Then
                MessageBox.Show("Caracter inválido, use letras, dígitos, espacio en blanco, coma y guión")
                e.Handled = True
            End If
        End If
    End Sub

    Private Sub Txt_Calidades_Validating(sender As Object, e As System.ComponentModel.CancelEventArgs) Handles Txt_Calidades.Validating
        If Txt_Calidades.Text.Trim = "" Then
            MessageBox.Show("Error - Calidades no puede quedar vacío")
            e.Cancel = True
        End If
    End Sub

    Private Sub Txt_Acuerdo_MinJusticia_KeyPress(sender As Object, e As KeyPressEventArgs) Handles Txt_Acuerdo_MinJusticia.KeyPress
        If Asc(e.KeyChar) = Keys.Return Then
            Sendkey.Send("{tab}")
        ElseIf Asc(e.KeyChar) <> 8 Then
            If InStr("ABCDEFGHIJKLMNOPQRSTUVWXYZ,° 0123456789-", Char.ToUpper(e.KeyChar)) = 0 Then
                MessageBox.Show("Caracter inválido, use letras, dígitos, espacio en blanco, coma y guión")
                e.Handled = True
            End If
        End If
    End Sub

    Private Sub Txt_Acuerdo_MinJusticia_Validating(sender As Object, e As System.ComponentModel.CancelEventArgs) Handles Txt_Acuerdo_MinJusticia.Validating
        If Txt_Acuerdo_MinJusticia.Text.Trim = "" Then
            MessageBox.Show("Error - Acuerdo no puede quedar vacío")
            e.Cancel = True
        End If
    End Sub

    Private Sub Btn_Regresar_Click(sender As Object, e As EventArgs) Handles Btn_Regresar.Click
        Txt_Cedula.Text = DirectCast(Cmb_FuncionariosDisponibles.SelectedItem, DataRowView).Item("Cedula")
        Txt_Nombre.Text = DirectCast(Cmb_FuncionariosDisponibles.SelectedItem, DataRowView).Item("Nombre_Funcionario")
        Txt_Tratamiento.Focus()
        Grp_FuncionariosDisponibles.Visible = False
    End Sub

#End Region

#Region "Metodos"

    Sub Despliega()
        NuevaFila = dtProcuradores.Rows(BindingContext(dtProcuradores).Position)
        Txt_Codigo.Text = NuevaFila.Item("Procurador")
        Txt_Cedula.Text = NuevaFila.Item("Cedula")
        Txt_Nombre.Text = NuevaFila.Item("Nombre_Procurador")
        Txt_Tratamiento.Text = NuevaFila.Item("Tratamiento")
        Txt_GradoProcurador.Text = NuevaFila.Item("GradoProcurador")
        Txt_Cargo.Text = NuevaFila.Item("CargoProcurador")
        Cmb_Area.SelectedValue = NuevaFila.Item("Area")
        Txt_Carnet.Text = NuevaFila.Item("Carnet")
        Txt_Calidades.Text = NuevaFila.Item("CalidadesProcurador")
        Txt_Acuerdo_MinJusticia.Text = NuevaFila.Item("Acuerdo_MinJusticia")
    End Sub

    Sub Limpiar()
        Txt_Codigo.Text = ""
        Txt_Cedula.Text = ""
        Txt_Nombre.Text = ""
        Txt_Tratamiento.Text = ""
        Txt_GradoProcurador.Text = ""
        Txt_Cargo.Text = ""
        Cmb_Area.SelectedIndex = 0
        Txt_Carnet.Text = ""
        Txt_Calidades.Text = ""
        Txt_Acuerdo_MinJusticia.Text = ""
        Grp_FuncionariosDisponibles.Visible = False
    End Sub

#End Region

    
End Class